C++单、双精度浮点数16进制转10进制原理及代码 |
您所在的位置:网站首页 › ieee 转换 › C++单、双精度浮点数16进制转10进制原理及代码 |
一、浮点数16进制转10进制原理
浮点数有两种:单精度float(4字节) 和 双精度double(8字节)。 1、单精度结构表 符号位 Sign (S)指数部分 Exponent (E)尾数部分 Mantissa (M)3130 ~ 2322 ~ 01bit8bit23bit 2、双精度结构表 符号位 Sign (S)指数部分 Exponent (E)尾数部分 Mantissa (M)6362 ~ 5251 ~ 01bit11bit52bit 3、浮点数 16进制转10进制原理 公式: (1)、 (-1)^S表示符号位,当S=0,V为正,S=1,V为负。 (2)、 M表示有效数字,大于等于1,小于2。. 单精度 M = 尾数部分十进制 * 2^(-23) + 1; 双精度 M = 尾数部分十进制 * 2^(-52) + 1。 (3)、 E表示指数数部分。 单精度 E = 指数部分十进制 - 127; 双精度 E = 指数部分十进制 - 1023; (4)、单精度浮点数16进制转10进制,例(42A54FCC): 十六进制42 A5 4F CC 二进制01000010 10100101 01001111 11001100 符号位(S)0指数部分10000101(十进制:133)尾数部分0100101 01001111 11001100(十进制:2445260)M 计算M = 2^(-23) * 2445260 + 1 = 1.2914977073669433592^E 计算2^E = 2^(133 - 127) = 2^6 = 64十进制计算 VV = (-1)^S * M * 2^E = 1 * 1.291497707366943359 * 64十进制结果 V82.65585327148437498·双精度浮点数计算方式同理。 二、代码代码在Qt上编译的,没有Qt可以将QByteArray替换为unsigned char*类型。 #include #include /*单精度浮点数(32位) 16进制转10进制*/ double hex32_10(QByteArray byteDate) { char* pData = byteDate.data(); //符号位 1 int sign = int(pData[0] >> 7); //指数位 8 int e = int(((pData[0] & 0x7F) > 7) & 0x01)) - 127; //小数位 23 int im = pData[3] & 0xFF; im |= (pData[2] |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |